home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / Pascal / Applications / TCPExample / PNL Libraries / MyMemory.p < prev    next >
Text File  |  1997-06-06  |  10KB  |  383 lines

  1. unit MyMemory;
  2.  
  3. interface
  4.  
  5.     uses
  6.         Types, 
  7.         MyAssertions;
  8.  
  9.     const
  10.         trash_byte = $E5; { odd, big, negative, easily recognizable }
  11.  
  12. { WARNING: MTrash et al only do anything in debugging mode! }
  13.  
  14. {$ifc not do_debug}
  15. {$definec MTrash(p,s)}
  16. {$definec MTrashPtr(p)}
  17. {$definec MTrashHandle(h)}
  18. {$elsec}
  19. {$definec MTrash(p,s) MFill(p,s,trash_byte)}
  20. {$definec MTrashPtr(p) MFill(p,GetPtrSize(p),trash_byte)}
  21. {$definec MTrashHandle(h) MFill(h^,MGetHandleSize(h),trash_byte)}
  22. {$endc}
  23.  
  24.     function MNewPtr ( var p: univ Ptr; size: longint ): OSErr;
  25.     function MNewHandle ( var data: univ Handle; size: longint ): OSErr;
  26.     function MSetPtrSize ( p: univ Ptr; size: longint ): OSErr;
  27.     function MSetHandleSize ( data: univ Handle; size: longint ): OSErr;
  28.     function MGrowHandleSize ( data: univ Handle; size: longint ): OSErr;
  29.     procedure MShrinkHandleSize( data: univ Handle; size: longint );
  30.     procedure MDisposePtr ( var p: univ Ptr );
  31.     procedure MDisposeHandle ( var data: univ Handle );
  32.     function MMungerFindString( data: Handle; offset: longint; const s: string ): longint;
  33.     function MMungerFind( data: Handle; offset: longint; ptr1: univ Ptr; len1: longint ): longint;
  34.     function MMungerInsert( data: Handle; offset: longint; ptr2: univ Ptr; len2: longint ): OSErr;
  35.     function MMungerInsertString( data: Handle; offset: longint; const s: string ): OSErr;
  36.     procedure MMungerDelete( data: Handle; offset: longint; len1: longint );
  37.     function MAppendToHandle( data: univ Handle; p: univ Ptr; len: longint ): OSErr;
  38.     procedure MZero ( p: univ Ptr; size: longint );
  39.     procedure MFill ( p: univ Ptr; size: longint; val: integer );
  40.     procedure MFillLong ( p: univ Ptr; size: longint; val: longint );
  41. { Ptr and size must be long alligned }
  42.     procedure LockHigh ( data: univ Handle );
  43.     procedure HLockState ( data: univ Handle; var state: SignedByte );
  44.     procedure HUnlockState ( data: univ Handle; var state: SignedByte );
  45.     procedure HRestoreState(hhhh: univ Handle; state: SignedByte);    
  46.     function MGetHandleSize( data: univ Handle ): longint;
  47.     function MGetPtrSize( data: univ Ptr ): longint;
  48.     
  49.     procedure MHLock( data: univ Handle );
  50.     procedure MHUnlock( data: univ Handle );
  51.     procedure MHPurge( data: univ Handle );
  52.     procedure MHNoPurge( data: univ Handle );
  53.  
  54.     function CheckPointer ( p: Ptr ): boolean;
  55.     function CheckPtr ( p: Ptr ): boolean;
  56.     function CheckHandle ( data: Handle ): boolean;
  57.  
  58. implementation
  59.  
  60.     uses
  61.         Memory, TextUtils,
  62.         MyLowLevel;
  63.  
  64.     function CheckPointer ( p: Ptr ): boolean;
  65.     begin
  66.         Assert( p <> nil );
  67.         CheckPointer := p <> nil;
  68.     end;
  69.  
  70.     function CheckPtr ( p: Ptr ): boolean;
  71.     begin
  72.         Assert( (p <> nil) & (GetPtrSize( p ) >= 0) & (MemError = noErr) );
  73.         CheckPtr := p <> nil;
  74.     end;
  75.  
  76.     function CheckHandle ( data: Handle ): boolean;
  77.     begin
  78.         Assert( (data <> nil) & (GetHandleSize( data ) >= 0) & (MemError = noErr) );
  79.         CheckHandle := data <> nil;
  80.     end;
  81.  
  82.     function MNewPtr ( var p: univ Ptr; size: longint ): OSErr;
  83.         var
  84.             err: OSErr;
  85.     begin
  86.         Assert( size >= 0 );
  87.         p := NewPtr(size);
  88.         err := MemError;
  89.         if (err = noErr) then begin
  90.             MTrashPtr( p );
  91.         end;
  92.         MNewPtr := err;
  93.     end;
  94.  
  95.     function MNewHandle ( var data: univ Handle; size: longint ): OSErr;
  96.         var
  97.             err: OSErr;
  98.     begin
  99.         Assert( size >= 0 );
  100.         data := NewHandle(size);
  101.         err := MemError;
  102.         if (err = noErr) then begin
  103.             MTrashHandle( data ); 
  104.         end;
  105.         MNewHandle := err;
  106.     end;
  107.  
  108.     function MSetPtrSize ( p: univ Ptr; size: longint ): OSErr;
  109. {$ifc do_debug}
  110.         var
  111.             oldsize: longint;
  112. {$endc}
  113.     begin
  114. {$ifc do_debug}
  115.         Assert( p <> nil );
  116.         Assert( size >= 0 );
  117.         oldsize := GetPtrSize( p );
  118.         if oldsize < size then begin
  119.             SetPtrSize( p, size );
  120.             if MemError = noErr then begin
  121.                 MTrash( AddPtrLong( p, oldsize ), size - oldsize );
  122.             end;
  123.         end else if oldsize > size then begin
  124.             MTrash( AddPtrLong( p, size ), oldsize - size );
  125.         end;
  126. {$endc}
  127.         if CheckPtr( p ) then begin
  128.             SetPtrSize( p, size );
  129.             MSetPtrSize := MemError;
  130.         end else begin
  131.             MSetPtrSize := -1;
  132.         end;
  133.     end;
  134.  
  135.     function MSetHandleSize ( data: univ Handle; size: longint ): OSErr;
  136. {$ifc do_debug}
  137.         var
  138.             oldsize: longint;
  139. {$endc}
  140.     begin
  141. {$ifc do_debug}
  142.         Assert( data <> nil );
  143.         Assert( size >= 0 );
  144.         oldsize := MGetHandleSize( data );
  145.         Assert( MemError = noErr );
  146.         if oldsize < size then begin
  147.             SetHandleSize( data, size );
  148.             if MemError = noErr then begin
  149.                 MTrash( AddPtrLong( data^, oldsize ), size - oldsize );
  150.             end;
  151.         end else if oldsize > size then begin
  152.             MTrash( AddPtrLong( data^, size ), oldsize - size );
  153.         end;
  154. {$endc}
  155.         if CheckHandle( data ) then begin
  156.             SetHandleSize( data, size );
  157.             MSetHandleSize := MemError;
  158.         end else begin
  159.             MSetHandleSize := -1;
  160.         end;
  161.     end;
  162.  
  163.     function MGrowHandleSize ( data: univ Handle; size: longint ): OSErr;
  164. {$ifc do_debug}
  165.         var
  166.             oldsize: longint;
  167. {$endc}
  168.     begin
  169. {$ifc do_debug}
  170.         Assert( data <> nil );
  171.         Assert( size >= 0 );
  172.         oldsize := MGetHandleSize( data );
  173.         Assert( MemError = noErr );
  174.         Assert( size >= oldsize );
  175. {$endc}
  176.         MGrowHandleSize := MSetHandleSize( data, size );
  177.     end;
  178.     
  179.     procedure MShrinkHandleSize( data: univ Handle; size: longint );
  180. {$ifc do_debug}
  181.         var
  182.             oldsize: longint;
  183. {$endc}
  184.         var
  185.             junk: OSErr;
  186.     begin
  187. {$ifc do_debug}
  188.         Assert( data <> nil );
  189.         Assert( size >= 0 );
  190.         oldsize := MGetHandleSize( data );
  191.         Assert( MemError = noErr );
  192.         Assert( size <= oldsize );
  193. {$endc}
  194.         junk := MSetHandleSize( data, size );
  195.         Assert( junk = noErr );
  196.     end;
  197.     
  198.     procedure MDisposePtr ( var p: univ Ptr );
  199.     begin
  200.         if (p <> nil) & CheckPtr( p ) then begin
  201.             MTrashPtr( p );
  202.             DisposePtr(p);
  203.             p := nil;
  204.         end;
  205.     end;
  206.  
  207.     procedure MDisposeHandle ( var data: univ Handle );
  208.     begin
  209.         if (data <> nil) & CheckHandle( data ) then begin
  210.             MTrashHandle( data );
  211.             DisposeHandle( data );
  212.             data := nil;
  213.         end;
  214.     end;
  215.  
  216.     procedure MZero (p: univ Ptr; size: longint);
  217.     begin
  218.         MFill( p, size, 0 );
  219.     end;
  220.     
  221.     procedure MFill (p: univ Ptr; size: longint; val: integer);
  222.         var
  223.             i: UInt32;
  224.     begin
  225.         Assert( size >= 0 );
  226.         if CheckPointer(p) then begin
  227.             if size > 0 then begin { since i is unsigned, size-1 must be >= 0 }
  228.                 for i := 0 to size - 1 do begin
  229.                     AddPtrLong(p, i)^ := SignedByte(val);
  230.                 end;
  231.             end;
  232.         end;
  233.     end;
  234.  
  235.     procedure MFillLong (p: univ Ptr; size: longint; val: longint);
  236. { Ptr and size must be long alligned }
  237.         type
  238.             longPtr = ^longint;
  239.         var
  240.             i: longint;
  241.     begin
  242.         Assert( size >= 0 );
  243.         if CheckPointer(p) then begin
  244.             Assert( (band(ord4(p), 3) = 0) & (band(size, 3) = 0) );
  245.             i := longint(p);
  246.             while size > 3 do begin
  247.                 longPtr(i)^ := val;
  248.                 i := i + 4;
  249.                 size := size - 4;
  250.             end;
  251.         end;
  252.     end;
  253.  
  254.     procedure LockHigh ( data: univ Handle );
  255.     begin
  256.         if CheckHandle( data ) then begin
  257.             MoveHHi( data );
  258.             HLock( data );
  259.         end;
  260.     end;
  261.  
  262.     procedure HLockState ( data: univ Handle; var state: SignedByte );
  263.     begin
  264.         if CheckHandle( data ) then begin
  265.             state := HGetState(data);
  266.             HLock(data);
  267.         end;
  268.     end;
  269.  
  270.     procedure HUnlockState ( data: univ Handle; var state: SignedByte );
  271.     begin
  272.         if CheckHandle( data ) then begin
  273.             state := HGetState(data);
  274.             HUnlock(data);
  275.         end;
  276.     end;
  277.  
  278.     procedure HRestoreState( data: univ Handle; state: SignedByte );
  279.     begin
  280.         if CheckHandle( data ) then begin
  281.             HSetState( data, state );
  282.         end;
  283.     end;
  284.     
  285.     procedure MHLock( data: univ Handle );
  286.     begin
  287.         if CheckHandle( data ) then begin
  288.             HLock( data );
  289.         end;
  290.     end;
  291.  
  292.     procedure MHUnlock( data: univ Handle );
  293.     begin
  294.         if CheckHandle( data ) then begin
  295.             HUnlock( data );
  296.         end;
  297.     end;
  298.  
  299.     procedure MHPurge( data: univ Handle );
  300.     begin
  301.         if CheckHandle( data ) then begin
  302.             HPurge( data );
  303.         end;
  304.     end;
  305.  
  306.     procedure MHNoPurge( data: univ Handle );
  307.     begin
  308.         if CheckHandle( data ) then begin
  309.             HNoPurge( data );
  310.         end;
  311.     end;
  312.  
  313.     function MGetHandleSize( data: univ Handle ): longint;
  314.     begin
  315.         MGetHandleSize := 0;
  316.         if CheckHandle( data ) then begin
  317.             MGetHandleSize := GetHandleSize( data );
  318.         end;
  319.     end;
  320.  
  321.     function MGetPtrSize( data: univ Ptr ): longint;
  322.     begin
  323.         MGetPtrSize := 0;
  324.         if CheckPtr( data ) then begin
  325.             MGetPtrSize := GetPtrSize( data );
  326.         end;
  327.     end;
  328.  
  329.     function MMungerFind( data: Handle; offset: longint; ptr1: univ Ptr; len1: longint ): longint;
  330.     begin
  331.         if CheckHandle( data ) then begin
  332.             Assert( (len1 > 0) & (0 <= offset) & (offset <= MGetHandleSize( data ) ) );
  333.             MMungerFind := Munger(data, offset, ptr1, len1, nil, 0);
  334.         end else begin
  335.             MMungerFind := -1;
  336.         end;
  337.     end;
  338.     
  339.     function MMungerFindString( data: Handle; offset: longint; const s: string ): longint;
  340.     begin
  341.         MMungerFindString := MMungerFind( data, offset, @s[1], length(s) );
  342.     end;
  343.     
  344.     function MMungerInsert( data: Handle; offset: longint; ptr2: univ Ptr; len2: longint ): OSErr;
  345.         var
  346.             junk_long: longint;
  347.     begin
  348.         if CheckHandle( data ) then begin
  349.             Assert( (len2 >= 0) & (0 <= offset) & (offset <= MGetHandleSize( data ) ) );
  350.             junk_long := Munger(data, offset, nil, 0, ptr2, len2);
  351.             MMungerInsert := MemError;
  352.         end else begin
  353.             MMungerInsert := -1;
  354.         end;
  355.     end;
  356.     
  357.     function MMungerInsertString( data: Handle; offset: longint; const s: string ): OSErr;
  358.     begin
  359.         MMungerInsertString := MMungerInsert( data, offset, @s[1], length(s) );
  360.     end;
  361.     
  362.     procedure MMungerDelete( data: Handle; offset: longint; len1: longint);
  363.         var
  364.             junk_long: longint;
  365.     begin
  366.         if CheckHandle( data ) then begin
  367.             Assert( (len1 >= 0) & (0 <= offset) & (offset + len1 <= MGetHandleSize( data ) ) );
  368.             junk_long := Munger(data, offset, nil, len1, @junk_long, 0);
  369.         end;
  370.     end;
  371.     
  372.     function MAppendToHandle( data: univ Handle; p: univ Ptr; len: longint ): OSErr;
  373.     begin
  374.         Assert( (len >= 0) );
  375.         MAppendToHandle := -9987;
  376.         if CheckHandle( data ) & CheckPointer( p ) then begin
  377.             MAppendToHandle := PtrAndHand( p, data, len );
  378.         end;
  379.     end;
  380.     
  381.     
  382. end.
  383.